<?php
require_once Q::ini ( 'app_config/ROOT_DIR' ) . '/app/helper/wxpay/WxPay.Data.php';
/**
 * 支付宝接口支付控制器
 */
class Controller_wxnotify extends Controller_Abstract
{

    /*
     * 付款完成后支付宝调取的后台方法，我们以此方法为依据对数据库内容进行更改，并确定是否支付成功；
     */

    function actionImportCallback ($needSign = true)
    {
        /**
         * 微信支付回调接口
         *s
         * @return string 返回成功或者失败。
         */
        $xml = file_get_contents('php://input', 'r');
        Helper_Common::log(print_r($xml,true),'wxcallbackimport');
        //当返回false的时候，表示notify中调用NotifyCallBack回调失败获取签名校验失败，此时直接回复失败
        $handle = new WxPayNotify();
        $handle->ImportHandle($xml);
    }
}

   class WxPayNotify extends WxPayNotifyReply
    {
        /**
         *
         * 回调入口
         * @param bool $needSign  是否需要签名输出
         */
       final public function ImportHandle($xml)
       {
           $msg = "OK";
           $callarray = $this->FromXml($xml);
           if(is_array($callarray) && count($callarray) && isset($callarray['attach'])){
                if(!empty($callarray['attach'])){
                    $attach = json_decode($callarray['attach'],true);
                    $user_id = $attach['user_id'];
                    $payfee = $attach['payfee'];
                }
               
               $out_trade_no = $callarray['out_trade_no'];
               $coreorder = coreorder::find('ordersn =?',$out_trade_no)->getOne();
               if(!$coreorder->id()){
                  echo '订单未找到';die;
               }
               $userobj = Acctuser::find("id = ?",$coreorder->user_id)->getOne();
               if(!$userobj->id()){
                   echo("nouser");
                   Syslog::notloginlogs('微信回调时，用户不存在或者已经被删除');
                   exit();
               }
               $acct = acct::find('id = ?',$userobj->acct_id)->getOne();
               // if(!$acct->id()){
               //     Syslog::notloginlogs('微信回调时，用户所属代理不存在或者已经被删除');
               //     exit();
               // }
               $wxmchid=trim($acct->mch_id);
               $wxkey=trim($acct->key);
               $wxappid=trim($acct->app_id);
               $wxappsecret = trim($acct->app_secret);
               $config = array(
                       'APPID'=>$wxappid,
                       'MCHID'=>$wxmchid,
                       'WXKEY'=> $wxkey,
                       'APPSECRET'=>$wxappsecret,
               );
               WxPayConfig::setconfig($acct);
                
               $result = Helper_WxPayApi::notify(array($this, 'NotifyCallBack'), $msg,$xml);
               //验证成功,写逻辑
               if($result == true){

                  
                   // 商户订单号
                   $out_trade_no = $callarray['out_trade_no'];
                   // 交易号
                   $trade_no = $callarray['transaction_id'];
                   // 交易状态
                   $trade_status = $callarray['return_code'];
       
                   $pay_fee = floatval($callarray['cash_fee']/100);
                   //dump($pay_fee);die;
                   $notify_time = time();
                   //多次访问
                   
                   if($coreorder->status >=1){
                     echo '订单已经支付，请不要重复支付';die;
                   }
                   if($coreorder->fee == $pay_fee){
                      //支付完成

                      $order = coreorder::notifyOK($coreorder->id);
                      //更新累计消费金额
                      $userobj->total_consume+=$userobj->total_consume;
                      $userobj->save();
                   }else{
                       echo '非法请求';die;
                   }
                   
                   if($coreorder->id()){
      
                       $this->SetReturn_code("SUCCESS");
                       $this->SetReturn_msg("OK");
                        $this->ReplyNotify();
                   }

                else{
                    $this->SetReturn_code("FAIL");
                    $this->SetReturn_msg($msg);
                    $this->ReplyNotify(false);
                    $this->ReplyNotify();
                }
           } else{
            echo('OK');
           }
           
       
       }
     }
    
        /**
         *
         * 回调方法入口，子类可重写该方法
         * 注意：
         * 1、微信回调超时时间为2s，建议用户使用异步处理流程，确认成功之后立刻回复微信服务器
         * 2、微信服务器在调用失败或者接到回包为非确认包的时候，会发起重试，需确保你的回调是可以重入
         * @param array $data 回调解释出的参数
         * @param string $msg 如果回调处理失败，可以将错误信息输出到该方法
         * @return true回调出来完成不需要继续回调，false回调处理未完成需要继续回调
         */
        public function NotifyProcess($data, $msg)
        {
            //TODO 用户基础该类之后需要重写该方法，成功的时候返回true，失败返回false
            return true;
        }
    
        /**
         *
         * notify回调方法，该方法中需要赋值需要输出的参数,不可重写
         * @param array $data
         * @return true回调出来完成不需要继续回调，false回调处理未完成需要继续回调
         */
        final public function NotifyCallBack($data)
        {
            return true;
            
        }
    
        /**
         *
         * 回复通知
         * @param bool $needSign 是否需要签名输出
         */
        final private function ReplyNotify()
        {
          
          //如果需要签名
          if( $this->GetReturn_code() == "SUCCESS")
          {
             $str= "<xml>
                    <return_code><![CDATA[SUCCESS]]></return_code>
                    <return_msg><![CDATA[OK]]></return_msg>
                    </xml>";
          }else{
              
            $str=  "<xml>
                    <return_code><![CDATA[FAIL]]></return_code>
                    <return_msg><![CDATA['签名失败']]></return_msg>
                    </xml>";
          }
          Helper_WxPayApi::replyNotify($str);
          
        }

       
        }
